// Tencent is pleased to support the open source community by making
// 蓝鲸智云 - 监控平台/日志平台 (BlueKing - Monitor/Log) available.
// Copyright (C) 2017-2022 THL A29 Limited, a Tencent company. All rights reserved.
// Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License.
// You may obtain a copy of the License at http://opensource.org/licenses/MIT
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
//

package otlp

import (
	"go.opentelemetry.io/collector/model/otlpgrpc"
	"go.opentelemetry.io/collector/model/pdata"

	"github.com/TencentBlueKing/bk-collector/receiver"
)

var Encoders = []receiver.Encoder{JsonEncoder(), PbEncoder()}

// Json Encoder

func JsonEncoder() receiver.Encoder {
	return jsonEncoder{}
}

type jsonEncoder struct{}

func (jsonEncoder) Type() string { return "json" }

func (jsonEncoder) UnmarshalTraces(buf []byte) (pdata.Traces, error) {
	req, err := otlpgrpc.UnmarshalJSONTracesRequest(buf)
	if err != nil {
		return pdata.Traces{}, err
	}
	return req.Traces(), nil
}

func (jsonEncoder) UnmarshalMetrics(buf []byte) (pdata.Metrics, error) {
	req, err := otlpgrpc.UnmarshalJSONMetricsRequest(buf)
	if err != nil {
		return pdata.Metrics{}, err
	}
	return req.Metrics(), nil
}

func (jsonEncoder) UnmarshalLogs(buf []byte) (pdata.Logs, error) {
	req, err := otlpgrpc.UnmarshalJSONLogsRequest(buf)
	if err != nil {
		return pdata.Logs{}, err
	}
	return req.Logs(), nil
}

// Pb Encoder

func PbEncoder() receiver.Encoder {
	return pbEncoder{}
}

type pbEncoder struct{}

func (pbEncoder) Type() string { return "pb" }

func (pbEncoder) UnmarshalTraces(buf []byte) (pdata.Traces, error) {
	req, err := otlpgrpc.UnmarshalTracesRequest(buf)
	if err != nil {
		return pdata.Traces{}, err
	}
	return req.Traces(), nil
}

func (pbEncoder) UnmarshalMetrics(buf []byte) (pdata.Metrics, error) {
	req, err := otlpgrpc.UnmarshalMetricsRequest(buf)
	if err != nil {
		return pdata.Metrics{}, err
	}
	return req.Metrics(), nil
}

func (pbEncoder) UnmarshalLogs(buf []byte) (pdata.Logs, error) {
	req, err := otlpgrpc.UnmarshalLogsRequest(buf)
	if err != nil {
		return pdata.Logs{}, err
	}
	return req.Logs(), nil
}
